○MFC SDIにて画面描画と印刷処理
■画面と別の印刷
MFC SDIでは ○○○View::OnDraw(CDC* pDC) の描画関数が
画面描画と印刷描画が共通になっていますので、
画面と別の印刷をしたい場合は IsPrinting にて処理を分ける必要があります
void ○○○View::OnDraw(CDC* pDC)
{
CFffffffDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDC->IsPrinting()){
//印刷描画
pDC->TextOut(0,0,"印刷描画");
}else{
//画面描画
pDC->TextOut(0,0,"画面描画");
}
}
■複数ページの印刷
@SetMaxPageにて印刷するページ数を指定します。
BOOL ○○○::OnPreparePrinting(CPrintInfo* pInfo)
{
pInfo->SetMaxPage(2);
return DoPreparePrinting(pInfo);
}
AOnPrintメッセージハンドラを追加します
m_nCurPageにて現在印刷中のページ数が解りますので
ページ数にあわせて描画します。
void ○○○View::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
switch (pInfo->m_nCurPage){//現在のページのカウンタ
case 1://1ページ目の印刷
pDC->TextOut(0,0,"印刷用描画1ページ目");
break;
case 2://2ページ目の印刷
pDC->TextOut(0,0,"印刷用描画2ページ目");
break;
}
CView::OnPrint(pDC, pInfo);
}
■描画サイズを求めるには
void ○○○::OnDraw(CDC* pDC)
{
CAaaaDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDC->IsPrinting()){
//印刷描画
//用紙のサイズ(ピクセル数)を求める
int width = pDC->GetDeviceCaps(PHYSICALWIDTH);
int height = pDC->GetDeviceCaps(PHYSICALHEIGHT);
//オフセットをマイナスする
width=width - pDC->GetDeviceCaps(PHYSICALOFFSETX)*2;
height=height - pDC->GetDeviceCaps(PHYSICALOFFSETY)*2;
pDC->Ellipse(0,0,width,height);//用紙いっぱいに円を書く
}else{
//画面描画
CRect rect;
GetClientRect(&rect);
pDC->Ellipse(rect.top,rect.left,rect.right,rect.bottom);//画面いっぱいに円を書く
}
}
■用紙サイズ(ミリ)を求める
//用紙のサイズ(ピクセル数)を求める
int width = pDC->GetDeviceCaps(PHYSICALWIDTH);
int height = pDC->GetDeviceCaps(PHYSICALHEIGHT);
//プリンタの1インチあたりのピクセル数を求める
int PrX_i = pDC->GetDeviceCaps(LOGPIXELSX);
int PrY_i = pDC->GetDeviceCaps(LOGPIXELSY);
//ミリ単位になおす
int right = (int )(double(((double )width / (double)PrX_i) * 25.4 + .5));
int bottom = (int )(double(((double )height / (double)PrY_i) * 25.4 + .5));
TRACE("用紙サイズ %d : %d\n",right,bottom);
▲トップページ
>
Windows と C++